package com.hspedu.customgeneric;

/**
 * @Author Stringzhua
 * @Date 2024/3/14 13:47
 * description:
 */
@SuppressWarnings("all")
public class CustomerInterfaceGeneric {
    public static void main(String[] args) {

    }
}

/*
 * 泛型接口使用的说明
 * 1.接口中,静态成员也不能使用泛型
 * 2.泛型接口的类型,是在继承接口或者实现接口时确定
 * */
//在继承接口时指定泛型接口的类型
interface IA extends IUsb<String, Double> {

}

//2.1当实现IA接口时,因为IA在继承IUsb接口时,指定了U为String R为Double
//在实现IUsb接口的方法时,使用String替换U,使用Double替换R
class AA implements IA {

    @Override
    public Double get(String s) {
        return null;
    }

    @Override
    public void hi(Double aDouble) {

    }

    @Override
    public void run(Double r1, Double r2, String u1, String u2) {

    }
}

//2.2实现接口时,直接指定泛型接口的类型
//给U指定Integer 给R指定了Float
//所以，当我们实现IUsb方法时,会使用Integer替换U,使用Float替换R
class BB implements IUsb<Integer, Float> {

    @Override
    public Float get(Integer integer) {
        return null;
    }

    @Override
    public void hi(Float aFloat) {

    }

    @Override
    public void run(Float r1, Float r2, Integer u1, Integer u2) {

    }
}

//3.没有指定类型,默认为Object
//等价于class CC implements IUsb<Object,Object>{}
//等价于用Object去替换U,R
//会产生警告,应该指定一个具体的类型
//建议直接写成: IUsb<Object,Object>{}
class CC implements IUsb {

    @Override
    public Object get(Object o) {
        return null;
    }

    @Override
    public void hi(Object o) {

    }

    @Override
    public void run(Object r1, Object r2, Object u1, Object u2) {

    }
}

interface IUsb<U, R> {
    int n = 10;

    //    U name;//不能这样使用
    //普通方法中，可以使用接口泛型
    R get(U u);

    void hi(R r);

    void run(R r1, R r2, U u1, U u2);

    //在jdk8中,可以在接口中,使用默认方法,也是可以使用泛型
    default R method(U u) {
        return null;
    }
}